--[[Mongodb数据库driver]]
local _inc = class("MongoMgr")
-- ==========================
--default params
local mongo_l = require("resty.mongol")
--连接池的实际作用(管理类的连接池实现暂时不需要)
local IDLE_TIMEOUT = 10 * 1000 --10s
local KEEPALIVE_CNE = 10 --连接池保持数量
-- ==========================

function _inc:ctor()
    self._inc = mongo_l:new()
    self._db = nil
    self._col = nil

    self._iscon = false --是否连接成功
    self._islogin = false --是否登录数据库
end

--连接
function _inc:connect(cfg)
    local host, port = cfg["host"], cfg["port"]
    local d = Ding
    self._inc:set_timeout(self.TIMEOUT)
    local ok, err = self._inc:connect(host, port)
    if not ok then
        d.Logger:error("Failed to connect: %s:%s", host, port)
        return false
    end
    d.Logger:info("Connect to the db suc %s:%s", host, port)

    self._iscon = true
    return true
end

--断开连接
--@isimmedia bool是否立即关闭
function _inc:close(isimmedia)
    if isimmedia then
        self._inc:close()
        return
    end
    d.Logger:debug("close the mongo connect!")
    self._inc:set_keepalive(IDLE_TIMEOUT, KEEPALIVE_CNE)
end

--用户登录
--@username string用户名
--@pwd      string用户密码
function _inc:set_dbauth(username, pwd)
    if self:_is_db() then
        self._db:auth(username, pwd)
    end
end

--设置使用的db的名称
--@dbname string db名字
function _inc:set_db(dbname)
    self._db = self._inc:new_db_handle(dbname)
end

--设置当前使用的col名字
--@colname string col名字
function _inc:set_col(colname)
    if self:_is_db() then
        self._col = self._db:get_col(colname)
    end
    return self
end

--设置db使用的col的名字
--@dbname  string db的名字
--@colname string col的名字
function _inc:set_db_col(dbname, colname)
    local db = self._inc:new_db_handle(dbname)
    self._col = db:get_col(colname)
    self._db = db
    return self._col
end

--数据库find_one
--@tbparams  table查询条件
--@retfields table查询的返回
function _inc:find_one(tbparams, retfields)
    if self:_is_col() then
        return self._col:find_one(tbparams, retfields)
    end
end

--数据库find
--@tbparams  table查询条件
--@retfields table查询的返回
--@retmaxcnt number返回的最大值
function _inc:find(tbparams, retfields, retmaxcnt)
    if self:_is_col() then
        self._col:find(tbparams, retfields, retmaxcnt)
    end
end

--塞入数据
--@docs              table数据库塞入数据
--@continue_on_error number是否塞入错误的时候继续执行
--@safe              bool(*git desc*safe can be a boolean or integer, defaults to 0 or false. If 1 or ``true, the program will issue a cmdgetlasterror` to server to query the result. If `false`, return value `n` would always be `-1`)
function _inc:insert_data(docs, continue_on_error, safe)
    if self:_is_col() then
        local n, error = self._col:insert(docs, continue_on_error, safe)
        local d = Ding
        if error then
            d.Logger:error("Mongodb-Col insert handle raise error!->%s\n", error)
        else
            d.Logger:debug("Mongodb-Col insert handle suc!%s", docs)
        end
        if n == 0 then
            d.Logger:info("Col insert the data suc!")
        end
    else
        d.Logger:error("Mongodb not choose col yet!")
    end
end

--更新数据
--@selector         table更新条件
--@update           table更新内容
--@upsert           number(0 or 1)是否直接补充一条如果没有匹配条件
--@multiupdata      number(0 or 1)是否批量更新还是只更新匹配第一条
--@safe             bool(*git desc*safe can be a boolean or integer, defaults to 0. If 1, the program will issue a cmd getlasterror to server to query the result. If false, return value n would always be -1)
function _inc:update(selector, update, upsert, multiupdate, safe)
    if self:_is_col() then
        local n, error = self._col:update(selector, update, upsert, multiupdate, safe)
        if error then
            d.Logger:error("Mongodb update handle raise error!->%s\n", error)
        end
    end
end

--更新

--检查是否指定db
function _inc:_is_db()
    return self._db ~= nil
end

--检查是否指定col
function _inc:_is_col()
    return self._col ~= nil
end

return _inc
